القرص المرن و استعماله عن طريق ال BIOS

بسم الله الرحمن الرحيم

القرص المرن هو دعامة تخزين مغنطيسية من أوائل دعائم التخزين، أخترع عام 1970 من طرف شركة IBM . هو موجود بأحجام و سعات تخزين مختلفة، أشهرها و أكثرها استعمالا القرص المرن 3.5 بوصة ذي السعة 1.44 ميقا بايت. يتكون القرص المرن من غلاف خارجي يحفظ بداخله قرص بلاستيكي مكسو بمادة ممغنطة سلبا أو إيجابا على الوجين أو على وجه واحد فقط. هذه المادة الممغنطة تسمح بتخزين و حفظ البيانات الرقمية 0 و 1 على شكل أقطاب سالبة و موجبة.

لقراءة أو كتابة هذه المعلومات نستعمل جهاز قارئ القرص المرن الذي يمتلك رأس قراءة و كتابة أو رأسين قراءة و كتابة خاص بكل وجه.
في حالة القراءة: تقوم الرأس باسترجاع المعلومات عن طريق التحريض المغنطيسي. أي أنها تتأثر بالمجال المغنطيسي المولد من سطح القرص المرن.
في حالة الكتابة: تقوم الرأس بكتابة المعلومات عن طريق المغنطة. أي أنها تقوم بتغيير الأقطاب السالبة و الموجبة.

تقسيم القرص المرن :

يقسم القرص المرن إلى مسارات حلقية و قطاعات زاوية ( على شكل زاوية)، أنظر الشكل أدناه.


 

ترقم المسارات من 0 إلى ن ،حيث أن العدد 0 يمثل المسار الخارجي ، و العدد ن يمثل أقصى عدد للمسارات على وجه واحد ( هنالك 80 مسار في قرص مرن 3.5 بوصة على كل وجه ).
ترقم القطاعات من 1 إلى ي حيث أن العدد ي يمثل أقصى عدد للقطاعات في كل مسار ( هنالك 18 قطاع في قرص مرن 3.5 بوصة في كل مسار).

هذه الطريقة في التقسيم تسهل عمل قارئ القرص المرن على تحديد مكان المعلومات المراد قراءتها على القرص. حيث أن تقاطع مسار حلقي مع قطاع زاوي يكون قطاع نسبي، يقصد بنسبي هنا أن عنوان القطاع مكون من رقم الوجه ( 0 أو 1)، رقم المسار و رقم القطاع الزاوي.

القطاع النسبي ذي سعة 512 بايت و هو أصغر وحدة يمكن قراءتها أو كتابتها على القرص المرن. هذا يعني أنه لا يمكن كتابة أو قراءة عدد أقل من 512 بايت بل يجب كتابة أو قراءة قطاع أو عدد محدد من القطاعات فقط.

في باقي هذا الدرس سنستخدم كلمة قطاع للدلالة على قطاع نسبي.


حساب سعة القرص المرن :

يمكن حساب سعة قرص مرن بواسطة المعادلة التالية :

سعة القرص المرن = عدد الأوجه × عدد المسارات على كل وجه × عدد القطاعات في كل مسار × سعة القطاع

مثال:
 سعة قرص مرن 3.5 بوصة ذي سعة 1.44 ميقا بايت تحسب هكذا :
السعة = 2 × 80 × 18 × 512 = 1474560 بايت = 1.44 ميقا بايت.

يمكن حساب عدد القطاعات في القرص المرن بواسطة المعادلة السابقة مع نزع العامل سعة القطاع :

عدد القطاعات في القرص المرن = عدد الأوجه × عدد المسارات على كل وجه × عدد القطاعات في كل مسار

مثال:
 عدد قطاعات قرص مرن 3.5 بوصة ذي سعة 1.44 ميقا بايت تحسب هكذا :
عدد القطاعات = 2 × 80 × 18 = 2880 قطاع .


استخدام القرص المرن بواسطة ال BIOS :

ال BIOS يمنح المبرمج واجهة برمجية سهلة كي يقرأ أو يكتب على القرص المرن. و هذا باستعمال الانقطاع 0x13 و وظائفه الفرعية. أهم هذه الوظائف هي :

وظيفة إعادة تهيئة القرص المرن :

هذه الوظيفة تقوم بإعادة تهيئة قارئات القرص المرن. يستحسن مناداتها عقب كل عملية قراءة أو كتابة انتهت بخطأ.

محتوى السجلات عند مناداة الانقطاع

الوصف

السجل

رقم الوظيفة و هو 0.

AH = 00h

رقم  قارئ القرص المرن. قيمته لا تهم ، سواء كانت 0 أو 1 لأن عملية إعادة التهيئة تطبق على جميع قارئات القرص المرن الموجودة.

0 أو 1 = DL

النتائج

الوصف

السجل

العملية ناجحة ، في هذه الحالة AH = 00h .

Flag Carry = 0

العملية فاشلة ، في هذه الحالة AH = رمز الخطأ .

Flag Carry = 1

محتوى السجلات BX, CX, DX, SI, DI, BP و سجلات أقسام الذاكرة SS,CS و DS لا يتغير بهذه الوظيفة. أما السجلات المتبقية فيمكن أن يتغير محتواها.

وظيفة قراءة قطاع أو عدة قطاعات :

هذه الوظيفة تقوم بقراءة قطاع أو مجموعة قطاعات من القرص المرن و نقـلها إلى مكان في الذاكرة المركزية.

محتوى السجلات عند مناداة الانقطاع

الوصف

السجل

رقم الوظيفة و هو 2.

AH = 02h

رقم  قارئ القرص المرن.

0 أو 1 = DL

رقم وجه القرص المرن ( الوجه 0 أو الوجه 1)

0 أو 1 = DH

رقم المسار.

CH

رقم القطاع داخل المسار.

CL

عدد القطاعات المراد قراءتها. ( اقرأ الملاحظة )

AL

عنوان قسم الذاكرة المركزية المراد نقل المعلومات إليها.

ES

 قيمة الانتقال داخل قسم الذاكرة المركزية.

BX

النتائج

الوصف

السجل

العملية ناجحة ، في هذه الحالة AH = 00h .

Flag Carry = 0

العملية فاشلة ، في هذه الحالة AH = رمز الخطأ .

Flag Carry = 1

محتوى السجلات BX, CX, DX, SI, DI, BP و سجلات أقسام الذاكرة لا يتغير بهذه الوظيفة. أما السجلات المتبقية فيمكن أن يتغير محتواها.

وظيفة كتابة قطاع أو عدة قطاعات :

هذه الوظيفة تقوم بكتابة قطاع أو مجموعة قطاعات على القرص المرن ، المعلومات المكتوبة تستخرج من مكان في الذاكرة المركزية.

محتوى السجلات عند مناداة الانقطاع

الوصف

السجل

رقم الوظيفة و هو 3.

AH = 03h

رقم  قارئ القرص المرن.

0 أو 1 = DL

رقم وجه القرص المرن ( الوجه 0 أو الوجه 1)

0 أو 1 = DH

رقم المسار.

CH

رقم القطاع داخل المسار.

CL

عدد القطاعات المراد كتابتها. ( اقرأ الملاحظة )

AL

عنوان قسم الذاكرة المركزية المراد نقل المعلومات منها.

ES

 قيمة الانتقال داخل قسم الذاكرة المركزية.

BX

النتائج

الوصف

السجل

العملية ناجحة ، في هذه الحالة AH = 00h .

Flag Carry = 0

العملية فاشلة ، في هذه الحالة AH = رمز الخطأ .

Flag Carry = 1

محتوى السجلات BX, CX, DX, SI, DI, BP و سجلات أقسام الذاكرة لا يتغير بهذه الوظيفة. أما السجلات المتبقية فيمكن أن يتغير محتواها.

رموز الأخطاء:

هذه هي رموز الأخطاء التي يعيدها ال BIOS بعد مناداة الوظائف السابقة و فشلها. يقوم ال BIOS بر فع راية الباقي ( Carry FLag )  و وضع رمز الخطأ في السجل AH.

رمز الخطأ

الوصف
01h رقم الوظيفة غير مسموح أو القارئ المطلوب غير موجود.
02h لم يتم إيجاد علامة العنونة على القرص المرن.
04h لم يتم إيجاد القطاع.
05h خطأ عند محاولة إعادة تهيئة القارئ.
07h خطأ عند محاولة  تهيئة القارئ.
09h خطأ عند نقل المعلومات بواسطة DMA. تخطي حدود قسم في الذاكرة المركزية.
0Ah قطاع فاسد.
10h خطأ في القراءة.
11h خطأ في القراءة مصحح بال ECC.
20h قارئ القرص المرن فاسد.
40h عملية البحث عن القطاع فشلت.
80h القارئ لا يستجيب . انتهاء مدة الانتظار بدون رد من قارئ القرص المرن.
AAh القارئ ليس مستعد.
CCh خطأ في الكتابة.

مثال تطبيقي:

هذا البرنامج الصغير مكتوب بصيغة المجمع NASM ، يقوم بقراءة قطاع الانطلاق ( القطاع 1 من المسار 0 على الوجه 0 ) و وضعه في الذاكرة المركزية.


 وضع عنوان قسم البيانات في AX  ;
نقل عنوان قسم البيانات إلى سجل البيانات الخارجي ES ;
وضع رقم وظيفة القراءة في AH ;
وضع رقم قارئ القرص المرن في DL و هو في هذه الحالة القارئ 0 ;
وضع رقم وجه القرص المرن في DH ;
وضع رقم المسار في CH ;
وضع رقم القطاع في CL ;
وضع عدد القطاعات المراد قراءتها و هو 1 في السجل AL ;
وضع قيمة الانتقال داخل قسم البيانات ( عنوان buffer ) في BX ;
مناداة الانقطاع 13h الخاصة بال BIOS ;
القفز إلى تعليمات معاينة الخطأ في حالة كان Carry Flag = 1 ;
بقية البرنامج ؟؟؟؟؟؟؟؟؟؟؟؟ ;

هنا يتم معالجة خطأ القراءة ، مثلا طباعة رسالة تصف ماهية الخطأ ;
أو محاولة إعادة القراءة مرة أخرى بعد مناداة وضيفة إعادة تهيئة القارئ ;

التصريح بمكان في الذاكرة حجمه 512 بايت يحوي المعلومات المقروءة من القطاع ;

:read_sector
mov ax,ds           
mov es,ax           
mov ah,02h           
mov dl,0           
mov dh,0           
mov ch,0           
mov cl,1           
mov al,1           
mov bx,buffer           
int 13h           
jc error           
...           

:error
...           

:buffer
times 512 db 0       

ملاحظات:

هذا العدد محدود . حيث أن هذه العملية تسمح بقراءة أو كتابة قطاعات متتابعة من نفس المسار  و على نفس الوجه.
فمثلا إذا كان رقم القطاع الأول هو 1 فعدد القطاعات المسموح قراءتها هو 18.
و إذا كان رقم القطاع الأول هو 5 فعدد القطاعات المسموح قراءتها هو 14.

القاعدة العامة هي :

عدد القطاعات المسموح قراءتها = عدد القطاعات في المسار - ( رقم أول قطاع - 1 )

المصطلحات:

English العربية Français
sector قطاع secteur
track مسار piste
floppy قرص مرن disquette
interrupt انقطاع interruption
DMA  وحدة الدخول المباشر للذاكرة المركزية DMA


 

الكاتب : مراد حمود

التاريخ : 15/11/2004